/* Abstract class that provides funtions 
 * helpful to objects that move. Inherits
 * IObject
 */

#pragma once

#include "IObject.h"

#define GRAVITY 9.8
	//A constant for gravity at 9.8 m/s^2

class SteeringBehaviors;

class IMovingObject: public IObject
{
public:
	virtual Ogre::Vector3 GetVelocity()=0;
	virtual void SetVelocity(Ogre::Vector3 nVelocity)=0;
	virtual double GetMass()=0;
	virtual void SetMass(double nMass)=0;
	virtual Ogre::Vector3 GetPerp()=0;
	virtual double GetMaxSpeed()=0;
	virtual void SetMaxSpeed(double nSpeed)=0;
	virtual double GetMaxForce()=0;
	virtual void SetMaxForce(double nForce)=0;
	virtual void SetAppliedForce(Ogre::Vector3 nForce)=0;
	virtual Ogre::Vector3 GetAppliedForce()=0;
	virtual bool IsSpeedMaxedOut()=0;
	virtual double Speed()=0;
	virtual double SpeedSq()=0;
	virtual Ogre::Vector3 GetHeading()=0;
	virtual void SetHeading(Ogre::Vector3 nHeading)=0;
	virtual void SetHeading(int xHeading, int yHeading, int zHeading)=0;
	virtual bool RotateHeadingToFacePosition(Ogre::Vector3 target)=0;
	virtual double GetMaxTurnRate()=0;
	virtual void SetMaxTurnRate(double nRate)=0;
	virtual Ogre::Vector3 GetCurrentAccel()=0;
	virtual void SetCurrentAccel(Ogre::Vector3 nAccel)=0;
	virtual void SetCurrentAccel(double xAccel, double yAccel, double zAccel)=0;
	virtual SteeringBehaviors* Steering()=0;
	virtual Ogre::Vector3 SmoothedHeading()=0;
	virtual bool isSmoothingOn()=0;
	virtual void SmoothingOn()=0;
	virtual void SmoothingOff()=0;
	virtual void ToggleSmoothing()=0;
};